function foo(num1, um2) {
  //类数组对象中（长得像是一个数组，但是本质上是一个对象）： arguments
  console.log(arguments);

  //常见的使用操作有三个，
  //获取参数的长度
  console.log(arguments.length);
  //根据索引获取某一个参数
  console.log(arguments[0]);
  console.log(arguments[1]);
  // callee 获取当前arguments对象所在的函数
  console.log(arguments.callee);
  // arguments.callee(); //会是一个无限递归
}
// foo(1, 12, 34);

// argunments 转 数组

function fn(num1, num2) {
  //自己遍历
  var newArr = [];
  for (let i = 0; i < arguments.length; i++) {
    newArr.push(arguments[i]);
  }
  console.log(newArr);
  // 使用数组方法调用
  var newArr2 = Array.prototype.slice.call(arguments); //原理见下方
  console.log(newArr2);
  var newArr3 = [].slice.call(arguments); //等同于上边的函数
  console.log(newArr3);
  //使用es6语法
  var newArr4 = Array.from(arguments);
  console.log(newArr4);
  //使用es6的展开运算符
  var newArr5 = [...arguments];
  console.log(newArr5);
}

fn(1, 2);

// Array.prototype.slice.call()的原理
//在有实例的时候， 通过[].slice()调用， 但是没有实例的时候，就可以通过原型的方法进行调用
Array.prototype.zhsclice = function (start, end) {
  //这里的this指向的原型，没有任何意义就需要通过call或者apply来改变this的指向
  //slice的内部实现就是这样的
  start = start || 0;
  end = end || this.length;
  var arr = this;
  var newArr = [];
  for (let i = start; i < end; i++) {
    newArr.push(arr[i]);
  }
  return newArr;
};
//所以在这里的实现就是通过call将类数组传入进来， 然后在内部返回一个数组
